package io.renren.common.utils;

import org.apache.commons.lang3.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/**
 * @Author: Caiyahui
 * @CreatTime: 2020/11/11 19:38
 * @QQ:1481465736
 * @Description:
 */
public class DateTimeUtils {
   public static DateTimeFormatter format_ymdhms = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        private static DateTimeFormatter format_ymdhmssss = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

        private static DateTimeFormatter format_ymds = DateTimeFormatter.ofPattern("yyyyMMdd");

        public static DateTimeFormatter format_ymd = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        public static DateTimeFormatter format_ymdhms_string = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");

        public static DateTimeFormatter format_ymdhms_no_signal = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");

        public static SimpleDateFormat yyyyMMdd_format = new SimpleDateFormat("yyyy-MM-dd");

        public static SimpleDateFormat ymdhms_format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        public static DateTimeFormatter format_ymd_String = DateTimeFormatter.ofPattern("yyMMdd");

    public static void main(String[] args) {

        Date date = stringToDate("2012-12-12 12:33:20",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        System.out.println(date);
    }

    /**
     * 字符串转date
     * @param date 时间戳
     * @param format format
     * @return 时间
     */
    public static Date stringToDate(String date,SimpleDateFormat format){
        try {
            if(StringUtils.isBlank(date)){
                return null;
            }
            return format.parse(date);
        } catch (ParseException e) {
        }
        return null;
    }




    /**
         * 将日期对象格式化成指定的字符串格式
         *
         * @param date         日期对象
         * @param formatString 格式化字符串
         * @return String
         */
        public static String getDateFormatString(Date date, String formatString) {

            String dateString = "";
            SimpleDateFormat format = new SimpleDateFormat(formatString);
            if (date != null) {
                dateString = format.format(date);
            }
            return dateString;
        }

        /**
         * 获取当前时间
         * @return
         * @throws Exception
         */
        public static LocalDateTime getCurrentDate(){
            LocalDateTime now = LocalDateTime.now();
            return now;
        }

        /**
         * 获取当前时间字符串，格式为yyyy-MM-dd HH:mm:ss
         * @return
         */
        public static String getCurrentDateStr(){
            String nowtime=getCurrentDate().format(format_ymdhms);
            return nowtime;
        }

        public static String getCurrentDateymd(){
            String nowtime=getCurrentDate().format(format_ymdhms_string);
            return nowtime;
        }

        public static String getCurrentDateyymd(){
            String nowtime=getCurrentDate().format(format_ymd_String);
            return nowtime;
        }

        /**
         * 获取当前时间字符串，格式为yyyyMMdd
         * @return
         */
        public static String getCurrentDateString(){
            String nowtime=getCurrentDate().format(format_ymds);
            return nowtime;
        }


        /**
         * 获取当前时间字符串，格式为yyyy-MM-dd
         * @return
         */
        public static String getCurrentDateStrymd(){
            String nowtime=getCurrentDate().format(format_ymd);
            return nowtime;
        }

        public static String getCurrentDateStr_MS(){
            String nowtime=getCurrentDate().format(format_ymdhmssss);
            return nowtime;
        }

        /**
         * 获取当前时间long值
         * @return
         */
        public static long getCurrentDataLong(){
            return new Date().getTime();
        }

        public static String format(Date date, SimpleDateFormat format) {
            if(null == date){
                return "";
            }
            return format.format(date);
        }

        /**
         * 将给定的时间秒转换为中文格式的时分秒
         *
         * @param second
         * @return
         */
        public static String formatSecond_ZH_HMS(Integer second) {
            String result = "0秒";
            if (null != second) {
                int hours = (int) (second / (60 * 60));
                int minutes = (int) (second / 60 - hours * 60);
                int seconds = (int) (second - minutes * 60 - hours * 60 * 60);

                String format;
                Object[] array;

                if (hours > 0) {
                    format = "%1$,d时%2$,d分%3$,d秒";
                    array = new Object[]{hours, minutes, seconds};
                } else if (minutes > 0) {
                    format = "%1$,d分%2$,d秒";
                    array = new Object[]{minutes, seconds};
                } else {
                    format = "%1$,d秒";
                    array = new Object[]{seconds};
                }
                result = String.format(format, array);
            }
            return result;
        }

        /**
         * 对日期进行加法操作
         *
         * @param date
         * @param days
         * @return
         */
        public static Date addDay(Date date, Integer days) {
            if (null != date) {
                Calendar cal = Calendar.getInstance();
                cal.setTime(date);
                cal.add(Calendar.DATE, days);
                return cal.getTime();
            }
            return null;
        }

        /**
         * 对日期进行加法操作
         *
         * @param date
         * @param month
         * @return
         */
        public static Date addMonth(Date date, Integer month) {
            if (null != date) {
                Calendar cal = Calendar.getInstance();
                cal.setTime(date);
                cal.add(Calendar.MONTH, month);
                return cal.getTime();
            }
            return null;
        }

        /**
         * 对日期进行加法操作
         * @param date
         * @param hours
         * @return
         */
        public static Date addHours(Date date, Integer hours) {
            if (null != date) {
                Calendar cal = Calendar.getInstance();
                cal.setTime(date);
                cal.add(Calendar.HOUR_OF_DAY, hours);
                return cal.getTime();
            }
            return null;
        }

        /**
         * 对日期的分钟进行加法操作
         * @param date
         * @param minutes
         * @return
         */
        public static Date addMinutes(Date date, Integer minutes) {
            if (null != date) {
                Calendar cal = Calendar.getInstance();
                cal.setTime(date);
                cal.add(Calendar.MINUTE, minutes);
                return cal.getTime();
            }
            return null;
        }

        /**
         * 比较两个日期的大小
         *
         * @param date1
         * @param date2
         * @return 日期相等，返回0；前者大，返回1；后者大，返回-1；
         */
        public static int dateCompare(Date date1, Date date2) {
            Calendar c1 = Calendar.getInstance();
            c1.setTime(date1);

            Calendar c2 = Calendar.getInstance();
            c2.setTime(date2);

            return c1.compareTo(c2);
        }

        /**
         * 判断当前日期是否在指定日期区域内(包含起止日期) [startDate,endDate]
         * <p/>
         * [null,null] --> return 1;
         *
         * @param now
         * @param startDate
         * @param endDate
         * @return -1：超出并小于startDate；0:在范围内；1：超出并大于endDate；
         */
        public static int validateDate(Date now, Date startDate, Date endDate) {
            if (null == startDate && null == endDate) {
                return 0;
            }
            if (null == startDate) {
                //当前时间大于endDate
                if (dateCompare(now, endDate) == 1) {
                    return 1;
                } else {
                    return 0;
                }
            } else {
                if (null == endDate) {
                    //当前时间小于startDate
                    if (dateCompare(startDate, now) == 1) {
                        return -1;
                    } else {
                        return 0;
                    }
                } else {
                    if (dateCompare(startDate, now) == 1) {
                        return -1;
                    } else if (dateCompare(now, endDate) == 1) {
                        return 1;
                    } else {
                        return 0;
                    }
                }
            }
        }

        /**
         * 计算两个日期先差多少秒
         * @param pre 前一个日期
         * @param after 后一个日期
         * @return
         */
        public static long calTimeDifference(Date pre,Date after){
            return (after.getTime()-pre.getTime())/1000;
        }



        /**
         * 计算两个时间相差的天数
         * @param stardate
         * @param enddate
         * @return
         */
        public static int getHour(Date stardate,Date enddate){
            long nd = 1000 * 24 * 60 * 60;
            long nh = 1000 * 60 * 60;
            long nm = 1000 * 60;
            long diff=enddate.getTime()-stardate.getTime();

            long day = diff / nd;

            long hour = diff % nd / nh;

            long min = diff % nd % nh / nm;

            return (int)day;
        }

        /**
         * 结束时间与当前时间计算相差的月数
         * @param enddate
         * @return
         */
        public static int getMonthSpace(String enddate, DateTimeFormatter format) {
            LocalDate formatted = LocalDate.parse(enddate,format);
            LocalDate today = LocalDate.now();
            Period per = Period.between(today,formatted);
            if(per.getYears() == 0 ){
                return per.getMonths();
            }else if(per.getYears() > 0 ){
                return (per.getYears() * 12) + per.getMonths();
            }

            return (per.getYears() * 12) + per.getMonths();
        }

        /**
         * 获取某个时间段之前的时间点
         * @return
         */
        public static String getSomeTimeStapStr(String sign){
            LocalDateTime beginDateTime =null;
            if (sign.equals("day")) {//一天前时间
                beginDateTime =LocalDateTime.now().minusDays(1L);
            }else if(sign.equals("week")){
                beginDateTime =LocalDateTime.now().minusWeeks(1L);
            }else if (sign.equals("month")) {
                beginDateTime =LocalDateTime.now().minusMonths(1L);
            }else if (sign.equals("year")) {
                beginDateTime =LocalDateTime.now().minusYears(1L);
            }
            String beginTime=beginDateTime.format(format_ymdhms);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            try {
                long timestap = sdf.parse(beginTime).getTime();
                beginTime = timestap+"";
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return beginTime;
        }

        public static String getSomeTimeDateStr(String sign){
            String beginTime="";
            LocalDateTime beginDateTime =null;
            if (sign.equals("day")) {//一天前时间
                beginDateTime =LocalDateTime.now().minusDays(1L);
            }else if(sign.equals("week")){
                beginDateTime =LocalDateTime.now().minusWeeks(1L);
            }else if (sign.equals("month")) {
                beginDateTime =LocalDateTime.now().minusMonths(1L);
            }else if (sign.equals("year")) {
                beginDateTime =LocalDateTime.now().minusYears(1L);
            }
            if (beginDateTime!=null) {
                beginTime = beginDateTime.format(format_ymdhms);
            }
            return beginTime;
        }


        /**
         * 获取失效时间点（在什么时间失效）
         * @param minutes       有效分钟数
         * @return
         */
        public static LocalDateTime getInvalidLocalDateTime(Long minutes){
            return LocalDateTime.now().minusMinutes(minutes);
        }


        /**
         * 获取当前年份
         * @return
         */
        public static String getCurrentYear(){
            Calendar instance = Calendar.getInstance();
            return instance.get(Calendar.YEAR)+"";
        }


        /**
         * 获取当前月份
         * @return
         */
        public static String getCurrentMonth(){
            Calendar instance = Calendar.getInstance();
            int month = instance.get(Calendar.MONTH);
            String result;
            if (month < 10){
                result = "0" + month;
            }else {
                result = month+"";
            }
            return result;
        }

        /** 获取无符号的当前时间
         * @return
         */
        public static String getCurrentDateStrNoSignal(){
            return getCurrentDate().format(format_ymdhms_no_signal);
        }


        /**
         * 获取前几个小时的时间
         * @param hours
         * @return
         */
        public static String getNextHourDateStrNoSignal(long hours){
            return LocalDateTime.now().plusHours(hours).format(format_ymdhms_no_signal);
        }


        public static Date localDateTimeToDate(LocalDateTime localDateTime) {
            ZoneId zone = ZoneId.systemDefault();
            Instant instant = localDateTime.atZone(zone).toInstant();
            return Date.from(instant);
        }

        /**
         * 小时取整
         * @param date
         * @param hour
         * @return
         */
        public static Date integralHour(Date date,Integer hour) {
            if(date==null||hour==null){
                return null;
            }
            long l = date.getTime()- 1;
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:00:00");
            try {
                Date parse = sdf.parse(sdf.format(new Date(l)));
                return addHours(parse, hour);
            } catch (ParseException e) {
                return null;
            }
        }

        /**
         * 分钟取整
         * 以十分钟为单位 ，去除尾端，加上 参数  46->40+minutes*10
         * @param date
         * @param minutes
         * @return
         */
        public static Date integral10Min(Date date,Integer minutes) {
            if(date==null||minutes==null){
                return null;
            }
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            int i = cal.get(Calendar.MINUTE);//获取分钟
            if(i%10==0){
                minutes--;
            }
            minutes=minutes*10-i%10;
            long l = date.getTime()- 1;
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:00");
            try {
                Date parse = sdf.parse(sdf.format(new Date(l)));
                return addMinutes(parse, minutes);
            } catch (ParseException e) {
                return null;
            }
        }

        /**
         * 天数取整
         * @param date
         * @param day
         * @return
         */
        public static Date integralDay(Date date,Integer day) {
            if(date==null||day==null){
                return null;
            }
            long l = date.getTime()- 1;
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
            try {
                Date parse = sdf.parse(sdf.format(new Date(l)));
                return addDay(parse, day);
            } catch (ParseException e) {
                return null;
            }
        }


}
